/**
 *
 */
package com.honeybees.framework.pagination.dialect;


import com.honeybees.framework.pagination.dialect.impl.DB2Dialect;
import com.honeybees.framework.pagination.dialect.impl.MySQLDialect;
import com.honeybees.framework.pagination.dialect.impl.OracleDialect;

/**
 * <dl>
 * <dt><b> 根据纯查询SQL语句和分页变量offset、limit生成数据库分页查询语句 </b></dt>
 * <p>
 * <dd>功能描述</dd>
 * </dl>
 * <p>
 * Copyright (C) All rights reserved.
 * </p>
 *
 * @author 李远明
 * @version 2015-10-23 16:10:51
 */
public interface Dialect {

    /**
     * <DL>
     * <DT><B> 数据库类型 </B></DT>
     * <p>
     * <DD>在MyBatis配置文件mybatisConfig.xml中配置：</DD>
     * <DD>
     * <pre>
     * &lt;plugin interceptor="com.honeybees.framework.mybatis.interceptor.PaginationInterceptor"&gt;
     * 	&lt;property name="databaseType" value="MySQL" /&gt;&lt;!-- Oracle --&gt;
     * &lt;/plugin&gt;
     * </pre>
     * </DD>
     * </DL>
     *
     * @author liym
     * @version 2015-12-21 14:53:02 {@link java.sql.DatabaseMetaData#getDatabaseProductName()}
     * @see com.honeybees.framework.mybatis.interceptor.PaginationInterceptor#intercept(org.apache.ibatis.plugin.Invocation)
     */
    enum Type {
        MySQL, Oracle, DB2;

        /**
         * <dl>
         * <dt><b> 根据数据名称获取 数据库方言 </b></dt>
         * <p>
         * <dd>功能描述</dd>
         * </dl>
         *
         * @param dbType 数据类型（与 {@link java.sql.DatabaseMetaData#getDatabaseProductName()} 的值相同）
         * @return {@linkplain Dialect}
         * @author 李远明
         * @version 2016-07-27 11:18:38
         */
        public static Dialect forType(String dbType) {
            if (dbType == null || dbType.isEmpty()) {
                throw new IllegalArgumentException("数据库类型不能为空：dbType");
            }
            Type type = Type.valueOf(dbType);

            Dialect dialect;
            switch (type) {
                case MySQL:
                    dialect = new MySQLDialect();
                    break;
                case Oracle:
                    dialect = new OracleDialect();
                    break;
                case DB2:
                    dialect = new DB2Dialect();
                    break;
                default:
                    throw new IllegalArgumentException("暂不支持该类型的数据库：" + dbType);
            }
            return dialect;
        }
    }

    /**
     * <DL>
     * <DT><B> 生成分页SQL语句 </B></DT>
     * <p>
     * <DD>详细介绍</DD>
     * </DL>
     * <p>
     *
     * @param querySql 原始查询SQL
     * @param offset   开始记录索引（从零开始）
     * @param limit    每页记录大小
     * @return 数据库相关的分页SQL语句
     * @version 2014-09-18 09:32:59
     */
    String getPageSql(String querySql, int offset, int limit);

    /**
     * <dl>
     * <dt><b> 生产查询数据总数SQL语句 </b></dt>
     * <p>
     * <dd>功能描述</dd>
     * </dl>
     *
     * @param querySql 原始查询SQL
     * @return 数据库相关的COUNT SQL语句
     * @author 李远明
     * @version 2016-07-20 20:53:31
     */
    String getCountSql(String querySql);

}
